import os
import sys
import re

def get_all_files(directory):
    """
    递归获取目录下所有文件的绝对路径列表（包括子目录）

    Args:
        directory: 目标目录路径

    Returns:
        list: 所有文件的绝对路径列表
    """
    file_list = []
    if not os.path.isdir(directory):
        return file_list

    for root, _, files in os.walk(directory):
        for file in files:
            file_path = os.path.abspath(os.path.join(root, file))
            file_list.append(file_path)

    return file_list

def print_file_list(file_list):
    """打印文件列表"""
    print("\n===== 查找到的文件列表 =====")
    if not file_list:
        print("未找到任何文件")
        return
    for idx, file_path in enumerate(file_list, 1):
        print(f"{idx}. {file_path}")
    print(f"===========================\n")

def process_file_names(file_list):
    """
    处理文件名列表：提取文件名，移除rv_/rv64_/rv32_前缀，去重后存入集合

    Args:
        file_list: 文件绝对路径列表

    Returns:
        set: 处理后的文件名集合
    """
    processed_set = set()
    # 匹配需要移除的前缀正则
    prefix_pattern = re.compile(r'^(rv_|rv64_|rv32_)')

    for file_path in file_list:
        # 提取文件名（不含路径）
        file_name = os.path.basename(file_path)
        # 移除指定前缀
        processed_name = prefix_pattern.sub('', file_name)
        # 添加到集合（自动去重）
        processed_set.add(file_name)

    return processed_set

def print_processed_names(processed_set):
    """打印处理后的文件名集合"""
    print("\n===== 处理后的文件名集合 =====")
    if not processed_set:
        print("集合为空")
        return
    for name in sorted(processed_set):  # 排序后打印，便于查看
        print(name)
    print(f"=============================\n")

def extract_field(line):
    """从单行中提取目标字段"""
    line = line.strip()
    if not line or line.startswith('#'):
        return None

    parts = line.split()
    if not parts:
        return None

    if parts[0] == '$import':
        return line
    elif parts[0] == '$pseudo_op':
        return parts[2] if len(parts) >= 3 else None
    else:
        return parts[0]

def process_file(file_path):
    """处理单个文件，提取所有符合条件的字段"""
    fields = []
    try:
        with open(file_path, 'r', encoding='utf-8') as f:
            for line in f:
                field = extract_field(line)
                if field:
                    fields.append(field)
    except Exception as e:
        print(f"处理文件失败: {file_path}，错误: {str(e)}", file=sys.stderr)

    return fields

def main(target_directory):
    """主函数：协调文件查找和字段提取流程"""
    # 获取所有文件列表
    print(f"开始查找目录 '{target_directory}' 下的所有文件...")
    files = get_all_files(target_directory)

    # 打印文件列表
    print_file_list(files)

    # 处理文件名并打印集合
    processed_names = process_file_names(files)
    print_processed_names(processed_names)

    if not files:
        print("未找到任何文件，终止处理")
        return

    # 处理所有文件并收集字段
    print(f"共找到 {len(files)} 个文件，开始提取字段...\n")
    all_fields = []
    for file_path in files:
        print(f"处理文件: {file_path}")
        file_fields = process_file(file_path)
        all_fields.extend(file_fields)
        for field in file_fields:
            print(f"  提取到: {field}")
        print()

    print("处理完成！")
    print(f"总计提取到 {len(all_fields)} 个字段")
    return all_fields

if __name__ == "__main__":
    if len(sys.argv) != 2:
        print("使用方法: python3 extract_fields.py <目标目录路径>", file=sys.stderr)
        sys.exit(1)

    target_dir = sys.argv[1]
    if not os.path.isdir(target_dir):
        print(f"错误: '{target_dir}' 不是有效的目录", file=sys.stderr)
        sys.exit(1)

    main(target_dir)
